package gamebook;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.imageio.ImageIO;
import persistencia.PFoto;

public class Foto {

    private int id;
    private int alto;
    private int ancho;
    private String descripcion;
    private boolean esPerfil;
    private Date fecha;
    private UsuarioGenerico usuario;
    private boolean esPublicacion;
    public static final int FOTXPAG = 10;

    /**
     * Constructor Vacío
     */
    public Foto() {
        //Constructor Vacio
    }

    /**
     * Este constructor asigna el alto y ancho a la imagen a partir del archivo
     * que contiene la imagen. En caso de que falle algo, asignará 0 a ambos atributos
     * @param File archivo 
     */
    public Foto(File archivo) {
        try {
            //Abrimos el archivo de la imagen para coger su tamaño
            BufferedImage original = ImageIO.read(archivo);
            this.ancho = original.getWidth();
            this.alto = original.getHeight();
        } catch (IOException ex) {
            //En caso de error ancho y alto serán cero
            this.ancho = 0;
            this.alto = 0;
        }
    }

    public int getAlto() {
        return alto;
    }

    public void setAlto(int alto) {
        this.alto = alto;
    }

    public int getAncho() {
        return ancho;
    }

    public void setAncho(int ancho) {
        this.ancho = ancho;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public boolean isEsPerfil() {
        return esPerfil;
    }

    public void setEsPerfil(boolean esPerfil) {
        this.esPerfil = esPerfil;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public UsuarioGenerico getUsuario() {
        return usuario;
    }

    public void setUsuario(UsuarioGenerico usuario) {
        this.usuario = usuario;
    }

    public boolean isEsPublicacion() {
        return esPublicacion;
    }

    public void setEsPublicacion(boolean esPublicacion) {
        this.esPublicacion = esPublicacion;
    }

    /**
     * Introduce la foto en la base de datos. El valor devuelto indica 
     * el éxito de la operación.
     * @param Foto foto que queremos guardar
     * @return true o false dependiendo de si se guardó bien o no
     */
    public boolean darAlta() {
        return PFoto.darAltaBD(this);
    }

    /**
     * Actualiza los datos de una foto en la base de datos. El valor devuelto
     * indica el éxito de la operación, pero esto puede ser por un error o porque
     * los datos que hemos intentado actualizar son iguales a los que había.
     * @param Foto foto que queremos actualizar
     * @return true o false dependiendo de si se cambio algo o no
     */
    public boolean actualizar() {
        return PFoto.actualizarBD(this);
    }

    /**
     * Elimina una foto de la base de datos y devuelve true o false según se
     * haya conseguido hacer bien o no.
     * @return true o false dependiendo de si se eliminó la foto
     */
    public boolean borrar(){
        return PFoto.borrarBD(this);
    }
    
    /**
     * Devuelve la foto que tiene como id el parámetro que le pasamos
     * al método. Si no existiese dicha foto, la respuesta es un null.
     * @param id id de la foto
     * @return Foto Devuelve una foto o null si no existe foto con dicho id.
     */
    public static Foto seleccionarPorIdBD(int id) {
        return PFoto.seleccionarPorIdBD(id);
    }

    /**
     * Devuelve el número de fotos de cierto usuario.
     * @param Usuario el usuario que es el dueño de las fotos
     * @return int Número de fotos si hubo algún error devuelve -1
     */
    public static int contarAlbumPorUsuario(UsuarioGenerico usuarioGenerico) {
        return PFoto.contarAlbumPorUsuarioBD(usuarioGenerico);
    }

    /**
     * Devuelve una lista de fotos de cierto usuario que le pasamos
     * al método. Si no hubiese ninguno devolvería null.
     * @param Usuario el usuario dueño de las fotos
     * @return List<Foto>
     */
    public static List<Foto> seleccionarAlbumPorUsuarioBD(UsuarioGenerico usuarioGenerico, int inicio, int cantidad) {
        return PFoto.seleccionarAlbumPorUsuarioBD(usuarioGenerico, inicio, cantidad);
    }


    public String getRutaOriginal() {
        return "almacen/" + this.getId() + ".jpg";
    }

    public String getRutaMiniatura() {
        return "almacen/" + this.getId() + "m.jpg";
    }

    public String getFechaString() {
        String[] nombreMes = new String[]{"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};
        String fechaString;
        Calendar cal = new GregorianCalendar();
        cal.setTime(fecha);
        String dia = Integer.toString(cal.get(Calendar.DAY_OF_MONTH));
        String mes = nombreMes[cal.get(Calendar.MONTH)];
        String año = Integer.toString(cal.get(Calendar.YEAR));
        fechaString = dia + "/" + mes + "/" + año;
        return fechaString;
    }
    
}
